home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Skunkware 5
/
Skunkware 5.iso
/
src
/
X11
/
xpaint-2.1.1
/
rw
/
readWriteXPM.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-03
|
4KB
|
150 lines
/* +-------------------------------------------------------------------+ */
/* | Copyright 1993, David Koblas (koblas@netcom.com) | */
/* | | */
/* | Permission to use, copy, modify, and to distribute this software | */
/* | and its documentation for any purpose is hereby granted without | */
/* | fee, provided that the above copyright notice appear in all | */
/* | copies and that both that copyright notice and this permission | */
/* | notice appear in supporting documentation. There is no | */
/* | representations about the suitability of this software for | */
/* | any purpose. this software is provided "as is" without express | */
/* | or implied warranty. | */
/* | | */
/* +-------------------------------------------------------------------+ */
#include <stdio.h>
#include <X11/Intrinsic.h>
#include "xpaint.h"
#include "image.h"
#include "xpm.h"
int WriteXPM(char *file, Image *image)
{
XpmAttributes attr;
attr.valuemask = XpmColormap;
attr.colormap = (Colormap)image->sourceColormap;
return XpmWriteFileFromPixmap(Global.display, file,
image->sourcePixmap, image->sourceMask, &attr) != XpmSuccess;
}
int TestXPM(char *file)
{
FILE *fd = fopen(file, "r");
char buf[40];
int i, n, ret = 0;
int cstart = False;
if (fd == NULL)
return 0;
n = fread(buf, sizeof(char), sizeof(buf), fd);
for (i = 0; i < n && ret == 0; i++) {
if (!cstart) {
if (buf[i] == '/' && buf[i+1] == '*')
cstart = True;
} else {
if (buf[i] == 'X' && buf[i+1] == 'P' && buf[i+2] == 'M')
ret = 1;
}
}
fclose(fd);
return ret;
}
Image *ReadXPM(char *file)
{
Display *dpy = Global.display;
XImage *xim, *mim;
int x, y, i;
Image *image;
XpmAttributes attr;
XColor *col;
unsigned char *ucp, *ump;
unsigned short *usp;
Colormap cmap = DefaultColormap(dpy, DefaultScreen(dpy));
int status;
attr.valuemask = XpmReturnPixels;
if ((status = XpmReadFileToImage(dpy, file, &xim, &mim, &attr)) != XpmSuccess) {
switch (status) {
case XpmColorError:
RWSetMsg("XPM Color Error");
break;
case XpmSuccess:
RWSetMsg("Success, shouldn't have error & success");
break;
case XpmOpenFailed:
RWSetMsg("XPM Open Failed");
break;
case XpmFileInvalid:
RWSetMsg("File Invalid");
break;
case XpmNoMemory:
RWSetMsg("Not enough memory");
break;
case XpmColorFailed:
RWSetMsg("Unable to allocate color");
break;
}
XpmFreeAttributes(&attr);
return NULL;
}
image = ImageNewCmap(attr.width, attr.height, attr.npixels);
if (mim != NULL) {
ImageMakeMask(image);
ump = image->maskData;
}
ucp = (unsigned char *)image->data;
usp = (unsigned short *)image->data;
col = (XColor *)XtMalloc(sizeof(XColor) * attr.npixels);
for (i = 0; i < attr.npixels; i++) {
col[i].pixel = attr.pixels[i];
col[i].flags = DoRed|DoGreen|DoBlue;
}
XQueryColors(dpy, cmap, col, attr.npixels);
for (i = 0; i < attr.npixels; i++)
ImageSetCmap(image, i, col[i].red >> 8, col[i].green >> 8, col[i].blue >> 8);
for (y = 0; y < xim->height; y++) {
for (x = 0; x < xim->width; x++) {
Pixel p;
if (mim != NULL) {
Pixel f = XGetPixel(mim, x, y);
if (!(*ump++ = (Boolean)f)) {
if (attr.npixels > 256)
*usp++ = 0;
else
*ucp++ = 0;
continue;
}
}
p = XGetPixel(xim, x, y);
for (i = 0; i < attr.npixels && col[i].pixel != p; i++)
;
if (attr.npixels > 256)
*usp++ = i;
else
*ucp++ = i;
}
}
XtFree((XtPointer)col);
XDestroyImage(xim);
XpmFreeAttributes(&attr);
return image;
}